// const {
//     baseUrl
// } = require('./env.js').dev;
const {
  baseUrl
} = require('./env.js').prod;

const appid = '';
// const appid = ' ';
let isRefreshing = true;
let subscribers = [];

function onAccessTokenFetched() {
  subscribers.forEach((callback) => {
      callback();
  })
  subscribers = [];
}

function addSubscriber(callback) {
  subscribers.push(callback);
  console.log('重新请求的队列', callback, subscribers)
}

let userInfo = '';

wx.getStorage({
  key: 'userInfo',
  success(res) {
      // console.log(res.data.userInfo);
      userInfo = res.data.userInfo;
  }
});

export class Http {
  constructor() {}

  request({
      url,
      data = {},
      method,
      header,
      callback = '',
      type,
  } = {}) {
      let _this = this;
      let _url = `${baseUrl}/${url}`;
      return new Promise((resolve, reject) => {
          // wx.showLoading({
          //     title: '正在加载',
          // });
          wx.request({
              url: _url,
              data,
              method,
              header: {
                  'content-type': type,
                  'QS_TOKEN': wx.getStorageSync('QS_TOKEN')
              },
              callback,
              fail(res) {
                  // setTimeout(function () {
                  //     wx.hideLoading()
                  // }, 200)
                  // reject(res)
                  reject('发送失败');
                  wx.showToast({
                      title: '网络错误',
                      icon: 'none',
                      duration: 2000
                  })
                  // wx.showModal({
                  //     title: '提示',
                  //     content: '网络错误',
                  //     success(res) {
                  //         if (res.confirm) {
                  //             console.log('用户点击确定');
                  //         } else if (res.cancel) {
                  //             console.log('用户点击取消');
                  //         }
                  //     }
                  // })
              },
              complete: res => {

                  setTimeout(function () {
                      wx.hideLoading()
                  }, 300)
                  //console.log('这里是请求canshu-----------------', url, data, method, header, res, wx.getStorageSync('QS_TOKEN'));
                  if (callback) return callback(res.data);
                  if (res.statusCode == 200) {
                      if (res.data.code == 200) {
                          resolve(res.data);
                          
                          
                      }
                      //统一拦截
                      if (res.data.code == 401) {
                          console.log('触发了一次401', url, )
                          wx.setStorageSync('isLogin', false)
                          // wx.showToast({
                          //     title: '登录已过期',
                          // })
                          // 将需要重新执行的接口缓存到一个队列中
                          if (userInfo) {
                              addSubscriber(() => {
                                  _this.request({
                                      url,
                                      data,
                                      method,
                                      header,
                                      callback: resolve,
                                      type,
                                  })
                              })
                          }
                         // console.log('这里是isRefreshing的值----', isRefreshing)
                          if (isRefreshing) {
                              getNewToken().then(() => {
                                  // 依次去执行缓存的接口
                                  onAccessTokenFetched();
                                  isRefreshing = true;
                              })
                          }
                          isRefreshing = false;
                      //    console.log('这里是isRefreshing的值', isRefreshing)
                      }

                      if (res.data.code == 500) {
                          // wx.hideLoading();
                          wx.showToast({
                              title: '操作失败',
                              icon: 'none',
                              duration: 2000
                          })
                      }
                      if (res.data.code == 404) {
                          // wx.hideLoading();
                          wx.showToast({
                              title: '参数效验失败',
                              icon: 'none'
                          })
                      }
                      if (res.data.code == 403) {
                          // wx.hideLoading();
                          wx.showToast({
                              title: '没有相关权限',
                              icon: 'none'
                          })
                      }
                      if (res.data.code == 402) {
                          wx.hideLoading(); 
                      }
                  } else {
                      // wx.hideLoading();
                      wx.showToast({
                          title: '请求有误',
                          icon: 'none'
                      })
                  }
              }
          })
      })
  }
}

// 获取token
const getNewToken = () => {
  return new Promise((resolve, reject) => {
      wx.login({
          success(res) {
              console.log('执行了重新登录的方法', res, userInfo);
              let userInfo = '';
              wx.getStorage({
                  key: 'userInfo',
                  success(resData) {
                      userInfo = resData.data;
                      if (userInfo) {
                          wx.request({
                              url: `${baseUrl}/wx/user/${appid}/login3`,
                              data: {
                                  "code": res.code,
                                  "signature": userInfo.signature,
                                  "rawData": userInfo.rawData,
                                  "encryptedData": userInfo.encryptedData,
                                  "iv": userInfo.iv
                              },
                              method: 'POST',
                              header: {
                                  'content-type': 'application/json',
                              },
                              success(res) {
                                  console.log('重新登陆成功返回', res);
                                  let r = res.data;
                                  // 将所有存储到观察者数组中的请求重新执行。

                                  if (res.data.code == 200) {
                                      //                         // 登录成功
                                      // const token = r['data']['token'];
                                      wx.hideLoading();
                                      wx.setStorageSync("QS_TOKEN", res.data.data);
                                      wx.setStorageSync('isLogin', true);
                                      resolve(res); //通过Promise的 resolve(),把返回的结果暴露出去  这个暴露好像用处不太大， 可以不用
                                  } else {
                                      wx.removeStorageSync('QS_TOKEN');
                                  }
                              }
                          })
                      } else {
                          wx.showToast({
                              title: '请先登录',
                              icon: 'none'
                          })
                          console.log('这里是拦截器---还没有登录哦', );
                      }
                  }
              });

          },
          fail(err) {
              reject()
              console.error('wx login fail', err);
          }
      });
  })
}
